package com.example.javapoint.threads.deadLock;

/**
 * 解决死锁的办法
 * 死锁还可能包括两个以上的线程。原因是检测死锁可能很困难。下面是四个线程发生死锁的示例：
 * 线程1锁定A，等待B
 * 线程2锁定B，等待C
 * 线程3锁定C，等待D
 * 线程4锁定D，等待A
 * 死锁中的主要问题是访问资源 A 和 B 的模式。为了解决这个问题，我们只需重新排序代码访问共享资源的语句。
 */
public class SolveDeadLockExample {
    public static void main(String[] args) {
        final String resource1 = "ratan jaiswal";
        final String resource2 = "vimal jaiswal";

        Thread t1 = new Thread(() -> {
            synchronized (resource1) {
                System.out.println("Thread 1: locked resource 1");

                try { Thread.sleep(100);} catch (Exception e) {}
            }

            synchronized (resource2) {
                System.out.println("Thread 1: locked resource 2");
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (resource2) {
                System.out.println("Thread 2: locked resource 2");

                try { Thread.sleep(100);} catch (Exception e) {}
            }
            synchronized (resource1) {
                System.out.println("Thread 2: locked resource 1");
            }
        });


        t1.start();
        t2.start();
    }
}
